/* 
 * File:   CollisionDetection.h
 * Author: Piotrek
 *
 * Created on 21 sierpień 2010, 16:49
 */


#ifndef _COLLISIONDETECTION_H
#define	_COLLISIONDETECTION_H

#include "RAPID/RAPID.H"
#include "Module.h"
#include "stdafx.h"
#include <vector>

/**
 * @brief Klasa zawierajaca funkcje do wykrywania kolizji za pomoca biblioteki RAPID.
 * @n Po tej klasie dziedzicza klasy, ktore chca byc wziete pod uwage w trakcie wykrywania kolizji.
 */
class CollisionDetection
{
public:

	/**
	 * konstruktor - dodaje obiekt do globalnej kolekcji obiektow @ref CollisionDetectionModels
	 */
	CollisionDetection();

	/// wirtualny destruktor
	virtual ~CollisionDetection(){};

    /// numer modulu kolidujacego (pierwszego znalezionego)
    int collidedModule;

    /**
     * @brief Inicjalizacja modelu kolizji.
     *
     * Metoda przygotowuje model RAPID na podstawie modulow obiektu,
     * dlatego powinna byc wywolana po dodaniu wszystkich modulow.
     */
    void InitializeCollisionDetectionModel();

    /**
     * @brief Statyczna metoda do wykrywania pierwszej kolizji we wszystkich
     * istniejacych obiektach bedacych pod kontrola systemu wykrywania kolizji.
     * @return 1 -wykrycie kolizji, 0 -brak kolizji
     */
    static int FindFirstCollisionInAllObjects();

	/// wektor modułów robota
    std::vector< Module > modules;

	/**
	 * czy obiekt jest obiektem klasy Robot (true) czy klasy StaticObject (false)
	 * @todo sprawdzanie typu obiektu za pomoca rzutowania
	 */
	bool isRobot;

	/// wektor wskaznikow do wszystkich obiektow podlegajacyh wykrywaniu kolizji (roboty, tasma, otoczenie)
    static std::vector<CollisionDetection *> CollisionDetectionModels;

	/**
	 * Usun dany modul z symulacji
	 * @param i - numer modulu w tablicy CollisionDetectionModels
	 * @return numer obiektu TcpConnection do usuniecia
	 */
	static int RemoveModel(unsigned int i);

     
private:

	/// zbior wartosci, ktory okresla jakiego rodzaju modele RAPID sa brane do wykrywania kolizji
	static enum RapidModelType {RapidTriangles, RapidCubes};

	/**
	 * Znajdz kolizje miedzy dwoma modulami. Kolizje sa wykrywane tylko wtedy gdy chociaz 1 z modulow jest robotem.
	 * @param model0 - model 0
	 * @param model1 - model 1
	 * @return 1 - wykrycie kolizji, 0 - brak kolizji
	 */
    static int FindFirstCollisionBetweenModules(CollisionDetection * model0, CollisionDetection * model1);

	/**
	 * Znajdz kolizje w module. Kolizje sa wykrywane tylko miedzy niesasiadujacymi modulami robota.
	 * @param model - obiekt klasy Robot
	 * @return 1 - wykrycie kolizji, 0 - brak kolizji
	 */
	static int FindFirstCollisionInModule(CollisionDetection * model);

	/**
	 * Metoda wywolujaca funkcje RAPID_Collide dla zadanych modeli z parametrem RAPID_FIRST_CONTACT
	 * @param model1 - wskaznik do obiektu typu RapidModule
	 * @param model1Type - rodzaj modelu do wykrywania kolizji dla modelu 1
	 * @param model2 - wskaznik do obiektu typu RapidModule
	 * @param model2Type - rodzaj modelu do wykrywania kolizji dla modelu 2
	 * @return 1 - wykrycie kolizji, 0 - brak kolizji
	 */
	static int CollisionDetection::CollisionDetectionInModules(RapidModule * model1, RapidModelType model1Type, RapidModule * model2, RapidModelType model2Type);

};
#endif	/* _COLLISIONDETECTION_H */

